package co.edu.usbcali.egrapico.logica;

/**
 * Clase para la traducci�n de la representaci�n de un
 * <Code>Objeto</Code> desde GraPiCO Textual hacia <I>C�lculo PiCO</I>. <P>
 * Recibe en GraPiCO Textual alguna de las sguientes opciones:<P> <Blockquote><Pre>
 *                   (RestriccionesRecepci�n,RestriccionesDelegaci�n)�[ListaM�todos]
 *                   (RestriccionesRecepci�n,)�[ListaM�todos]
 *                   (,RestriccionesDelegaci�n)�[ListaM�todos]
 *                   (RestriccionesRecepci�n,RestriccionesDelegaci�n)�[]
 *                   (RestriccionesRecepci�n,)�[]
 *                   (,RestriccionesDelegaci�n)�[]
 * </Pre></Blockquote> <P> Traducci�n a <I>C�lculo PiCO</I> seg�n sea el
 * caso:<P> <Blockquote><Pre>
 *                   (RestriccionesRecepci�n,RestriccionesDelegaci�n)�[ListaM�todos]
 * </Pre></Blockquote>
 *
 * @author Johanna Noguera Le�n & Alejandro Berm�dez Mart�nez.
 * @version 1.0
 * @since Enero de 2005
 */
public class Object {

    // Variable para almacenar el objeto representado en c�lculo PiCO.
    String objectPico = "";
    // Variables para almacenar las listas de recepci�n, delegaci�n y de
    // m�todos en GraPiCO Textual (GPT):
    String receptionConstraintGPT = "", delegationConstraintGPT = "", methodsGPT = "";
    // Objetos de la clase  ConstraintsList, para almacenar la traducci�n de
    // las listas de restricciones de recepci�n y delgaci�n en c�lculo PiCO.
    ConstraintsList reception, delegation;
    // Objeto de la clase MethodsList, para la traducci�n de la lista de m�todos.
    MethodsList methodsList;
    // Nombre o lista de nombres de los procesos que se est�n traduciendo.
    String nameCurrentProcess = "";

    /**
     * M�todo constructor de la clase
     * <Code>Object</Code>.<P> Divide el
     * <Code>Objeto</Code> en las tres partes que lo conforma:
     * <Code>Restricciones de Recepci�n</Code>,
     * <Code>Restricciones de
     * Delegaci�n</Code> y
     * <Code>Lista de M�todos</Code>.
     *
     * @param objectPico Expresion equivalente a la representaci�n de un objeto
     * en GraPiCO textual.
     * @param nameProcess Nombre o lista de nombres de procesos.
     */
    public Object(String objectPico, String nameProcess) {

        nameCurrentProcess = nameProcess;
        if (objectPico.indexOf(",") != 1) {
            receptionConstraintGPT = objectPico.substring(1, objectPico.indexOf(","));
        }

        delegationConstraintGPT = objectPico.substring(objectPico.indexOf(",") + 1, objectPico.indexOf("�") - 1);
        if (objectPico.indexOf("�") != objectPico.length() - 3) {
            methodsGPT = objectPico.substring(objectPico.indexOf("�") + 2, objectPico.length() - 1);
        }

    }

    /**
     * Metodo generador de la traducci�n de un
     * <Code>Objeto</Code>.<P> Obtiene la traducci�n de las
     * <Code>Restricciones de Recepci�n</Code> y
     * <Code>Restricciones de Delegaci�n</Code> concaten�ndolas con la
     * traducci�n de la
     * <Code>Lista de M�todos</Code> usando el s�mbolo de sincronizaci�n "�".
     * <P> Agrega mensajes de advertencia, sobre la falta de restricciones o
     * lista de m�todos, a los mensajes que genera el an�lisis sem�ntico.
     *
     * @return el
     * <Code>Objeto</Code> traducido a <I>C�lculo PiCO</I>.
     */
    public String traslate() {
        String nameProc = nameCurrentProcess.substring(nameCurrentProcess.lastIndexOf(",") + 1);
        objectPico += " (";
        // Si no tiene alg�n tipo de restriciones, no se traduce.
        if (receptionConstraintGPT.length() != 0) {
            reception = new ConstraintsList(receptionConstraintGPT, nameCurrentProcess);
            objectPico += reception.traslate() + " , ";
        } else {
            objectPico += " , "; // puede ser eliminada la coma
            SemanticAnalizer.PutSemanticMessages("Advertencia : No hay Restricciones de Recepci�n en el proceso " + nameProc);
        }
        if (delegationConstraintGPT.length() != 0) {
            delegation = new ConstraintsList(delegationConstraintGPT, nameCurrentProcess);
            objectPico += delegation.traslate();
        } else {
            SemanticAnalizer.PutSemanticMessages("Advertencia : No hay Restricciones de Delegaci�n en el proceso " + nameProc);
        }

        if (methodsGPT.length() != 0) {
            methodsList = new MethodsList(methodsGPT, nameCurrentProcess);
            objectPico += ") � [" + methodsList.traslate() + "] ";
        } else {
            objectPico += ") � [] ";
            SemanticAnalizer.PutSemanticMessages("Advertencia : No hay Lista de M�todos en el proceso " + nameProc);
        }
        return objectPico;
    }
}